import { delay, postMsg, fireEvent } from '../utils.js';

const A100000 = {
  // 一、营业收入
  yysr: {
    xqy: (saasData) => {
      const getItemValue = (code) => {
        const target = saasData.find((x) => x.subjectCode === code);
        const val = target ? parseFloat(target.amt || 0) : 0;
        return Number.isNaN(val) ? 0 : val;
      };
      const v001 = getItemValue('5001');
      const v051 = getItemValue('5051');
      return v001 + v051;
    },
    qy: (saasData) => {
      const getItemValue = (code) => {
        const target = saasData.find((x) => x.subjectCode === code);
        const val = target ? parseFloat(target.amt || 0) : 0;
        return Number.isNaN(val) ? 0 : val;
      };
      const v001 = getItemValue('6001');
      const v051 = getItemValue('6051');
      return v001 + v051;
    },
  },
  // 一、营业收入 减：营业成本(填写A102010\102020\103000)
  yycb: {
    xqy: (saasData) => {
      const getItemValue = (code) => {
        const target = saasData.find((x) => x.subjectCode === code);
        const val = target ? parseFloat(target.amt || 0) : 0;
        return Number.isNaN(val) ? 0 : val;
      };
      const v401 = getItemValue('5401');
      const v402 = getItemValue('5402');
      return v401 + v402;
    },
    qy: (saasData) => {
      const getItemValue = (code) => {
        const target = saasData.find((x) => x.subjectCode === code);
        const val = target ? parseFloat(target.amt || 0) : 0;
        return Number.isNaN(val) ? 0 : val;
      };
      const v401 = getItemValue('6401');
      const v402 = getItemValue('6402');
      return v401 + v402;
    },
  },
  // 一、营业收入 减：税金及附加
  yysjFj: {
    xqy: '5403',
    qy: '6403',
  },
  // 减：销售费用(填写A104000)
  xsfy: {
    xqy: '5601',
    qy: '6601',
  },
  // 减：管理费用(填写A104000)
  glfy: {
    xqy: '5602',
    qy: '6602',
  },
  // 减：财务费用(填写A104000)
  cwfy: {
    xqy: '5603',
    qy: '6603',
  },
  // 减：资产减值损失
  zcjzss: {
    xqy: '',
    qy: '6701',
  },
  // 加：公允价值变动收益
  gyjzbdsy: {
    xqy: '',
    qy: '6101',
  },
  // 一、营业收入 加：投资收益
  tzsy: {
    xqy: '5111',
    qy: '6111',
  },
  // 二、营业利润 加：营业外收入(填写A101010\101020\103000)
  yywsr: {
    xqy: '5301',
    qy: '6301',
  },
  // 二、营业利润 减：营业外支出(填写A102010\102020\103000)
  yywzc: {
    xqy: '5711',
    qy: '6711',
  },
};

const A101010 = {
  // 一、营业收入 （一）主营业务收入
  a1010103: {
    xqy: '5001',
    qy: '6001',
  },
  // 一、营业收入（二）其他业务收入
  a10101010: {
    xqy: '5051',
    qy: '6051',
  },
  // 二、营业外收入 （一）非流动资产处置利得
  a10101017: {
    xqy: '530101',
    qy: '630101',
  },
  // 二、营业外收入 （四）政府补助利得
  a10101020: {
    xqy: '530102',
    qy: '630102',
  },
  // 二、营业外收入 （五）盘盈利得
  a10101021: {
    xqy: '530104',
    qy: '630104',
  },
  // 二、营业外收入 （六）捐赠利得
  a10101022: {
    xqy: '530103',
    qy: '630103',
  },
  // 二、营业外收入 （九）汇兑收益
  a10101025: {
    xqy: '530105',
    qy: '630105',
  },
  // 二、营业外收入 （十）其他
  a10101026: {
    xqy: (saasData) => {
      const totalItem = saasData.find((x) => x.subjectCode === '5301');
      const total = totalItem ? totalItem.amt : 0;
      const value = saasData
        .filter((item) =>
          ['530105', '530103', '530104', '530102', '530101'].includes(
            item.subjectCode
          )
        )
        .reduce((p, c) => parseFloat(p) + parseFloat(c.amt || 0), 0);
      return `${Number.parseFloat(total) - Number.parseFloat(value)}`;
    },
    qy: (saasData) => {
      const totalItem = saasData.find((x) => x.subjectCode === '6301');
      const total = totalItem ? totalItem.amt : 0;
      const value = saasData
        .filter((item) =>
          ['630105', '630103', '630104', '630102', '630101'].includes(
            item.subjectCode
          )
        )
        .reduce((p, c) => parseFloat(p) + parseFloat(c.amt || 0), 0);
      return `${Number.parseFloat(total) - Number.parseFloat(value)}`;
    },
  },
};

const A102010 = {
  // 营业成本（一）主营业务成本
  xsspcb: {
    xqy: '5401',
    qy: '6401',
  },
  // 营业成本（二）其他业务成本
  clxscb: {
    xqy: '5402',
    qy: '6402',
  },
  // 营业外支出（一）非流动资产处置损失
  fldzcczss: {
    xqy: '571102',
    qy: '671102',
  },
  // 营业外支出（四）非常损失
  fcss: {
    xqy: '571106',
    qy: '671106',
  },
  // 营业外支出（五）捐赠支出
  jzzc: {
    xqy: '571109',
    qy: '671109',
  },
  // 营业外支出（六）赞助支出
  zzzc: {
    xqy: '571110',
    qy: '671110',
  },
  // 营业外支出（七）罚没支出
  fmzc: {
    xqy: '571108',
    qy: '671108',
  },
  // 营业外支出（八）坏账损失
  hzss: {
    xqy: '571103',
    qy: '671103',
  },
  // 营业外支出（九）无法收回的债券股权投资损失
  wfshdzqgqtzss: {
    xqy: '571104',
    qy: '671104',
  },
  // 营业外支出（十）其他
  yywzcqt: {
    xqy: (saasData) =>
      saasData
        .filter((x) => ['571101', '571107'].includes(x.subjectCode))
        .reduce((p, c) => p + Number.parseFloat(c.amt || 0), 0),
    qy: (saasData) =>
      saasData
        .filter((x) => ['671101', '671107'].includes(x.subjectCode))
        .reduce((p, c) => p + Number.parseFloat(c.amt || 0), 0),
  },
};

const A104000 = {
  // 一、职工薪酬 销售费用
  zgxcxsfy: {
    xqy: '560101',
    qy: '660101',
  },
  // 一、职工薪酬 管理费用
  zgxcglfy: {
    xqy: '560207',
    qy: '660207',
  },
  // 二、劳务费 管理费用
  lwfglfy: {
    xqy: '560218',
    qy: '660218',
  },
  // 三、咨询顾问费 管理费用
  zxgwfglfy: {
    xqy: '560214',
    qy: '660214',
  },
  // 四、业务招待费 管理费用
  ywzdfglfy: {
    xqy: '560208',
    qy: '660208',
  },
  // 五、广告费和业务宣传费 销售费用
  ggxcfxsfy: {
    xqy: '560107',
    qy: '660107',
  },
  // 六、佣金和手续费 销售费用
  yjsxfxsfy: {
    xqy: '560110',
    qy: '660110',
  },
  // 六、佣金和手续费 财务费用
  yjsxfcwfy: {
    xqy: '560303',
    qy: '660303',
  },
  // 七、资产折旧摊销费 管理费用
  zczjtxfglfy: {
    xqy: '560202',
    qy: '660202',
  },
  // 九、办公费 管理费用
  bgfglfy: {
    xqy: '560204',
    qy: '660204',
  },
  // 十、董事会费 管理费用
  dshfglfy: {
    xqy: '560217',
    qy: '660217',
  },
  // 十一、租赁费 管理费用
  zlfglfy: {
    xqy: '560216',
    qy: '660216',
  },
  // 十二、诉讼费 管理费用
  ssfglfy: {
    xqy: '560215',
    qy: '660215',
  },
  // 十三、差旅费 销售费用
  clfxsfy: {
    xqy: '560109',
    qy: '660109',
  },
  // 十三、差旅费 管理费用
  clfglfy: {
    xqy: '560206',
    qy: '660206',
  },
  // 十四、保险费 销售费用
  bxfxsfy: {
    xqy: '560106',
    qy: '660106',
  },
  // 十四、保险费 管理费用
  bxfglfy: {
    xqy: '560212',
    qy: '660212',
  },
  // 十五、运输、仓储费	销售费用
  ysccfxsfy: {
    xqy: (saasData) =>
      saasData
        .filter((x) => ['560103', '560104'].includes(x.subjectCode))
        .reduce((p, c) => parseFloat(p) + parseFloat(c.amt || 0), 0),
    qy: (saasData) =>
      saasData
        .filter((x) => ['660103', '660104'].includes(x.subjectCode))
        .reduce((p, c) => parseFloat(p) + parseFloat(c.amt || 0), 0),
  },
  // 十五、运输、仓储费	管理费用
  ysccfglfy: {
    xqy: '560220',
    qy: '660220',
  },
  // 十六、修理费 销售费用
  xlfxsfy: {
    xqy: '560102',
    qy: '660102',
  },
  // 十六、修理费 管理费用
  xlfglfy: {
    xqy: '560203',
    qy: '660203',
  },
  // 十七、包装费 销售费用
  bzfxsfy: {
    xqy: '560105',
    qy: '660105',
  },
  // 十八、技术转让费 管理费用
  jszrfglfy: {
    xqy: '560210',
    qy: '660210',
  },
  // 十九、研究费用 管理费用
  yjfyglfy: {
    xqy: '560209',
    qy: '660209',
  },
  // 二十一、利息收支 财务费用
  lxszcwfy: {
    xqy: (saasData) => {
      const getItemValue = (code) => {
        const target = saasData.find((x) => x.subjectCode === code);
        const val = target ? parseFloat(target.amt || 0) : 0;
        return Number.isNaN(val) ? 0 : val;
      };
      const d0301 = getItemValue('560301');
      const d0305 = getItemValue('560305');
      const d0306 = getItemValue('560306');

      return d0301 + d0305 - d0306;
    },
    qy: (saasData) => {
      const getItemValue = (code) => {
        const target = saasData.find((x) => x.subjectCode === code);
        const val = target ? parseFloat(target.amt || 0) : 0;
        return Number.isNaN(val) ? 0 : val;
      };
      const d0301 = getItemValue('660301');
      const d0305 = getItemValue('660305');
      const d0306 = getItemValue('660306');

      return d0301 + d0305 - d0306;
    },
  },
  // 二十二、汇兑差额 财务费用
  hdcecwfy: {
    xqy: '560302',
    qy: '660302',
  },
  // 二十三、现金折扣 财务费用
  xjzkcwfy: {
    xqy: '560304',
    qy: '660304',
  },
  // 二十五、其他 销售费用
  qtxsfy: {
    xqy: (saasData) =>
      saasData
        .filter((x) => ['560199', '560108'].includes(x.subjectCode))
        .reduce((p, c) => parseFloat(p) + parseFloat(c.amt || 0), 0),
    qy: (saasData) =>
      saasData
        .filter((x) => ['660199', '660108'].includes(x.subjectCode))
        .reduce((p, c) => parseFloat(p) + parseFloat(c.amt || 0), 0),
  },
  // 二十五、其他 管理费用
  qtglfy: {
    xqy: (saasData) =>
      saasData
        .filter((x) =>
          [
            '560299',
            '560205',
            '560213',
            '560219',
            '560223',
            '560211',
            '560222',
            '560224',
            '560221',
          ].includes(x.subjectCode)
        )
        .reduce((p, c) => parseFloat(p) + parseFloat(c.amt || 0), 0),
    qy: (saasData) =>
      saasData
        .filter((x) =>
          [
            '660299',
            '660205',
            '660213',
            '660219',
            '660223',
            '660211',
            '660222',
            '660224',
            '660221',
          ].includes(x.subjectCode)
        )
        .reduce((p, c) => parseFloat(p) + parseFloat(c.amt || 0), 0),
  },
};

const A105000 = {
  // 二、扣除类调整项目（三）业务招待费支出 账载金额
  ywzdfzczzje: {
    xqy: '560208',
    qy: '660208',
  },
  // 二、扣除类调整项目（六）利息支出 账载金额
  lxzczzje: {
    xqy: '560306',
    qy: '660306',
  },
  // 二、扣除类调整项目（八）税收滞纳金、加收利息 账载金额
  ssznjjslxzzje: {
    xqy: '571107',
    qy: '671107',
  },
  // 二、扣除类调整项目（九）赞助支出 账载金额
  zzzczzje: {
    xqy: '571110',
    qy: '671110',
  },
  // 二、扣除类调整项目（十一）佣金和手续费支出 账载金额
  yjhsxfzczzje: {
    xqy: '560303',
    qy: '660303',
  },
};

const A105050 = {
  // 一、工资薪金支出 账载金额
  gzxjzczzje: {
    xqy: '56020701',
    qy: '66020701',
  },
  // 一、工资薪金支出 实际发生额
  gzxjzcsjfse: {
    xqy: '221101',
    qy: '221101',
  },
  // 二、职工福利费支出 账载金额
  zgflfzczzje: {
    xqy: '56020702',
    qy: '66020702',
  },
  // 二、职工福利费支出 实际发生额
  zgflfzcsjfse: {
    xqy: '221103',
    qy: '221103',
  },
  // 四、工会经费支出 账载金额
  ghjfzczzje: {
    xqy: '56020704',
    qy: '66020704',
  },
  // 四、工会经费支出 实际发生额
  ghjfzcsjfse: {
    xqy: '221106',
    qy: '221106',
  },
  // 五、各类基本社会保障性缴款 账载金额
  bzxjkzzje: {
    xqy: '56020703',
    qy: '66020703',
  },
  // 五、各类基本社会保障性缴款 实际发生额
  bzxjksjfse: {
    xqy: '221104',
    qy: '221104',
  },
  // 六、住房公积金 实际发生额
  zfgjjsjfse: {
    xqy: '221105',
    qy: '221105',
  },
};

const A105060 = {
  // 一、本年广告费和业务宣传费支出
  bnggfhywxcfzc: {
    xqy: '560107',
    qy: '660107',
  },
  // 三、本年计算广告费和业务宣传费扣除限额的销售（营业）收入
  bnjsggfhywxcfkcedxssr: {
    xqy: '5001',
    qy: '6001',
  },
};

const getA105080ItemValue = (arr, name, prop) => {
  const found = arr.find((x) => x.assetsName === name);
  return found ? found[prop] || '0.00' : '0.00';
};

const A105080 = {
  // （一）房屋、建筑物 资产原值
  zzzcyz2: (arr) => getA105080ItemValue(arr, '房屋建筑物', 'assetsOrigAmt'),
  // （一）房屋、建筑物 本年折旧、摊销额
  zzbntx2: (arr) =>
    getA105080ItemValue(arr, '房屋建筑物', 'yearDepreciatonAmt'),
  // （一）房屋、建筑物 累计折旧、摊销额
  zzljzj2: (arr) =>
    getA105080ItemValue(arr, '房屋建筑物', 'totalDepreciatonAmt'),
  // （二）飞机、火车、轮船、机器、机械和其他生产设备 资产原值
  zzzcyz3: (arr) => getA105080ItemValue(arr, '机器设备', 'assetsOrigAmt'),
  // （二）飞机、火车、轮船、机器、机械和其他生产设备 本年折旧、摊销额
  zzbntx3: (arr) => getA105080ItemValue(arr, '机器设备', 'yearDepreciatonAmt'),
  // （二）飞机、火车、轮船、机器、机械和其他生产设备 累计折旧、摊销额
  zzljzj3: (arr) => getA105080ItemValue(arr, '机器设备', 'totalDepreciatonAmt'),
  // （三）与生产经营活动有关的器具、工具、家具等 资产原值
  zzzcyz4: (arr) => getA105080ItemValue(arr, '办公设备', 'assetsOrigAmt'),
  // （三）与生产经营活动有关的器具、工具、家具等 本年折旧、摊销额
  zzbntx4: (arr) => getA105080ItemValue(arr, '办公设备', 'yearDepreciatonAmt'),
  // （三）与生产经营活动有关的器具、工具、家具等 累计折旧、摊销额
  zzljzj4: (arr) => getA105080ItemValue(arr, '办公设备', 'totalDepreciatonAmt'),
  // （四）飞机、火车、轮船以外的运输工具 资产原值
  zzzcyz5: (arr) => getA105080ItemValue(arr, '运输设备', 'assetsOrigAmt'),
  // （四）飞机、火车、轮船以外的运输工具 本年折旧、摊销额
  zzbntx5: (arr) => getA105080ItemValue(arr, '运输设备', 'yearDepreciatonAmt'),
  // （四）飞机、火车、轮船以外的运输工具 累计折旧、摊销额
  zzljzj5: (arr) => getA105080ItemValue(arr, '运输设备', 'totalDepreciatonAmt'),
  // （五）电子设备 资产原值
  zzzcyz6: (arr) => getA105080ItemValue(arr, '电子设备', 'assetsOrigAmt'),
  // （五）电子设备 本年折旧、摊销额
  zzbntx6: (arr) => getA105080ItemValue(arr, '电子设备', 'yearDepreciatonAmt'),
  // （五）电子设备 累计折旧、摊销额
  zzljzj6: (arr) => getA105080ItemValue(arr, '电子设备', 'totalDepreciatonAmt'),
};

const combined = {
  A100000,
  A101010,
  A102010,
  A104000,
  A105000,
  A105050,
  A105060,
  A105080,
};

async function fillCell(doc, selector, value) {
  if (value === undefined) {
    return;
  }

  const el = $(selector, doc);
  const readonly = el.attr('readonly');
  if (el && el.length > 0 && !readonly) {
    el.val(value).trigger('input').trigger('change');
    await delay(200);
  }
}

function getActiveDocument() {
  const boxes = [
    'A100000',
    'A101010',
    'A102010',
    'A104000',
    'A105000',
    'A105050',
    'A105060',
    'A105080',
  ];

  const layerDoc = $('.layui-layer-content iframe')[0].contentWindow.document;

  for (let i = 0; i < boxes.length; i++) {
    const boxId = boxes[i];
    const box = $(`#${boxId}`, layerDoc);
    if (box.length > 0 && $(box).is(':visible')) {
      console.info(`active box: ${boxId}`);
      const boxDoc =
        i === 0
          ? layerDoc
          : $(`#${boxId} iframe`, layerDoc)[0].contentWindow.document;

      return [boxId, boxDoc];
    }
  }

  return undefined;
}

export async function fillTable(sheetData) {
  let message = '填报成功 ';
  try {
    const { hsqjData, type, assetAmt } = sheetData;
    const xqy = type === 'hsqj-small';
    const actives = getActiveDocument();

    if (!actives) {
      console.info('激活的iframe里未找到需要填报的项');
      return;
    }

    const [boxId, acitveDoc] = actives;
    const mappings = combined[boxId];

    console.group(`当前填报:${boxId}`);
    console.dir(mappings);

    const fillKeys = Object.keys(mappings);

    if (fillKeys.length === 0) {
      return;
    }

    const useAssetAmt = boxId === 'A105080';

    for (let i = 0; i < fillKeys.length; i += 1) {
      const key = fillKeys[i];

      let valueExp;
      if (useAssetAmt) {
        valueExp = mappings[key];
      } else {
        valueExp = mappings[key][xqy ? 'xqy' : 'qy'];
      }

      let value;

      if (useAssetAmt) {
        value = valueExp(assetAmt);
      } else if (typeof valueExp === 'string') {
        const found = hsqjData.find((x) => x.subjectCode === valueExp);
        value = found ? found.amt : undefined;
      } else if (typeof valueExp === 'function') {
        value = valueExp(hsqjData);
      }

      // eslint-disable-next-line no-await-in-loop
      await fillCell(acitveDoc, `#${key}`, value);
    }
  } catch (err) {
    message = '填报失败';
    console.error(err);
  } finally {
    postMsg('fillInputDone', { message });
  }
}
